<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 变量必须提前声明后使用

        // var a = 100;
        // console.log(a); // 100

        // console.log(b); // undefined
        // var b = 200;
        // 所有代码运行之前 有一个解析的阶段
        // 预解析阶段 会将代码里所有用 var 声明的变量 提升到作用域的最顶部
        // 提升的仅仅是声明语句 赋值动作并不提升


        // 正确顺序
        var b;
        console.log(b); // undefined
        b = 200;
        console.log(b); //200

        // 函数声明也存在提升
        // function 声明的具名函数会在预解析简短提升到作用于的最前面
        say();
        function say() {
            alert("hello");
        }

        // 思考
        // 这里的声明提升把foo 当作了一个变量 所以他不是一个函数
        foo(); // foo is not a function
        var foo = function () {
            alert("hi");
        };
    </script>
</body>

</html>